package com.duobaoyu.dby.supply.biz.client.resource.bean.vo;

import com.duobaoyu.dby.resource.remote.common.enums.ChannelSettingTypeEnum;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.google.common.collect.Lists;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.URL;

import javax.validation.constraints.NotBlank;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author liyang
 * @version 1.0.0
 * @ClassName ChannelSettingDetailConfigVO
 * @createTime 14:08:00 2023/08/25
 */
@Data
public class ChannelSettingDetailConfigVO implements Serializable {

    private static final long serialVersionUID = -5593334393023359929L;
    /**
     * 渠道配置ID
     */
    @ApiModelProperty(value = "渠道配置ID")
    private Long id;
    /**
     * 渠道编码
     */
    @ApiModelProperty(value = "渠道编码")
    private String channelCode;
    /**
     * 配置类型 1->预估运费配置；2->售后配置；3->审核策略配置；4->订单规则
     * @see ChannelSettingTypeEnum
     */
    @ApiModelProperty(value = "配置类型 1->预估运费配置；2->售后配置；3->审核策略配置；4->订单规则")
    private Integer configType;
    /**
     * 配置参数-JSON
     */
    @ApiModelProperty(value = "配置参数-JSON")
    private ParamConfig ifParam;

    @Data
    public static class ParamConfig {
        /**
         * 售后配置
         */
        @ApiModelProperty(value = "售后配置")
        private List<AfterSaleConfig> afterSaleConfigs;
        /**
         * 审核策略
         */
        @ApiModelProperty(value = "审核策略")
        private AuditStrategy auditStrategy;
        /**
         * 预估运费配置
         */
        @ApiModelProperty(value = "预估运费配置")
        private Prefreight prefreight;
        /**
         * 订单规则
         */
        @ApiModelProperty(value = "订单规则")
        private OrderRule orderRule;

        @Data
        public static class Prefreight {
            /**
             * 运费条件1:订单金额
             */
            @ApiModelProperty(value = "运费条件1:订单金额")
            private Integer freightFilter;
            /**
             * 运费配置json
             */
            @ApiModelProperty(value = "运费配置json")
            private List<PrefreightParam> freightParam;
            /**
             * 计费方式: 1:区间计费
             */
            @ApiModelProperty(value = "计费方式: 1:区间计费")
            private Integer freightWay;

            /**
             * 预估运费设置
             */
            @Data
            public static class PrefreightParam {
                /**
                 * 开始金额
                 **/
                @ApiModelProperty(value = "开始金额")
                private BigDecimal startValue;
                /**
                 * 结束金额
                 */
                @ApiModelProperty(value = "结束金额")
                private BigDecimal endValue;
                /**
                 * 预估运费
                 */
                @ApiModelProperty(value = "预估运费")
                private BigDecimal freightValue;

                /**
                 * 预估运费
                 */
                @ApiModelProperty(value = "预估运费")
                private Integer isSort;
            }
        }
        /**
         * 审核策略
         */
        @Data
        public static class AuditStrategy {
            /**
             * 自动审核开关 true - 开启 ； false - 关闭
             */
            @ApiModelProperty(value = "自动审核开关 true - 开启 ； false - 关闭")
            private Boolean enable;
            /**
             * 自动提交审核时间（单位：小时）
             */
            @ApiModelProperty(value = "自动提交审核时间（单位：小时）")
            private Integer autoSubmit;
        }

        /**
         * 售后配置
         */
        @Data
        public static class AfterSaleConfig {
            /**
             * 配置名称
             */
            @ApiModelProperty(value = "配置名称")
            private String configName;
            /**
             * 仓库类型
             * //@see RepositoryTypeEnum
             */
            @ApiModelProperty(value = "仓库类型")
            private List<Integer> repositoryTypes;
            /**
             * 可选仓储类型(不可重复选择)
             * //@see RepositoryTypeEnum
             */
            @ApiModelProperty(value = "可选仓储类型(不可重复选择)")
            private List<Integer> repositoryTypesOptions;
            /**
             * 售后类型
             * //@see AfterSaleTypeEnum
             */
            @ApiModelProperty(value = "售后类型")
            private List<Integer> afterSaleTypes;
            /**
             * 售后规则
             */
            @JsonIgnore
            @ApiModelProperty(value = "售后规则")
            private List<AfterSaleRule> afterSaleRules;
            /**
             * 售后规则,用于适配前端结构
             */
            @ApiModelProperty(value = "售后规则,用于适配前端结构")
            private Map<Integer, List<Integer>> afterSaleRuleObj;
            /**
             * 售后说明（图片URL）
             */
            @URL
            @NotBlank
            @ApiModelProperty(value = "售后说明（图片URL）")
            private String explainUrl;
            @Data
            public static class AfterSaleRule{
                /**
                 * 售后类型
                 */
                @ApiModelProperty(value = "售后类型")
                private Integer afterSaleType;
                /**
                 * 支持的订单状态
                 */
                @ApiModelProperty(value = "支持的订单状态")
                private List<Integer> orderStatus;
            }

            /**
             * 组装适配给前端售后配置.
             * @return key:权益类型, value:订单状态集合
             */
            public Map<Integer, List<Integer>> getAfterSaleRuleObj() {
                return Optional.ofNullable(this.getAfterSaleRules()).orElse(Lists.newArrayList()).stream().collect(Collectors.toMap(AfterSaleRule::getAfterSaleType, AfterSaleRule::getOrderStatus));
            }
        }
    }

    @Data
    public static class OrderRule {
        /**
         * 商品拆单种类个数
         */
        @ApiModelProperty(value = "商品拆单种类个数")
        private Integer skuSplitVarietyCount;
        /**
         * 用户下单未付款，自动取消时间（单位：天）
         */
        @ApiModelProperty(value = "用户下单未付款，自动取消时间（单位：天）")
        private Integer orderCancelDay;
        /**
         * 用户下单未付款，自动取消时间（单位：小时）
         */
        @ApiModelProperty(value = "用户下单未付款，自动取消时间（单位：小时）")
        private Integer orderCancelHour;
        /**
         * 用户下单未付款，自动取消时间（单位：分钟）
         */
        @ApiModelProperty(value = "用户下单未付款，自动取消时间（单位：分钟）")
        private Integer orderCancelMinute;
        /**
         * 发货订单自动确认收货时间（单位：天）
         */
        @ApiModelProperty(value = "发货订单自动确认收货时间（单位：天）")
        private Integer shippingOrderConfirmTime;
        /**
         * 订单确认后，不能申请售后时间（单位：天）
         */
        @ApiModelProperty(value = "订单确认后，不能申请售后时间（单位：天）")
        private Integer orderConfirmNotAfterSaleTime;
        /**
         * 退换货/维修售后审核通过后，用户多长时间未寄回商品，自动取消售后（单位：天）
         */
        @ApiModelProperty(value = "退换货/维修售后审核通过后，用户多长时间未寄回商品，自动取消售后（单位：天）")
        private Integer returnProductRefundCancelTime;
        /**
         * 售后完成，自动确认售后完成时间（单位： 天）
         */
        @ApiModelProperty(value = "售后完成，自动确认售后完成时间（单位： 天）")
        private Integer autoAfteSaleCompleteTime;
    }
}
